home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’95 / INIT ThemeSong / AsyncInit.Asm < prev    next >
Assembly Source File  |  1995-06-24  |  4KB  |  252 lines

  1. ;            .VERBOSE
  2.  
  3.     INCLUDE    HGMacs.Txt
  4.     INCLUDE    Traps.D
  5.     INCLUDE    SysEquX.D
  6.     INCLUDE    ToolEqu.D
  7.     INCLUDE    FSEqu.D
  8. .TRAP    _DebugStr    $ABFF
  9. .TRAP    _SCSIDispatch $A815
  10. scsiStat    EQU    10
  11.     .MACRO    _SCSIStat
  12.     MOVE.W    #scsiStat,-(A7)
  13.     _SCSIDispatch
  14.     .ENDM
  15.  
  16. sndRefNum    EQU    -4
  17. buffsize    EQU    512*22
  18. N    EQU    8    ;number of buffers
  19. vblSize    EQU    vblPhase+2
  20. ffMode    EQU    0
  21.  
  22.     RECORD    0,INCREMENT
  23. extlen$    VAR    4
  24. MACRO    extlen    =|    ;use (An) addressing
  25. extptr    VAR    4
  26. rate    VAR    4
  27. datahndl    VAR    4
  28. codehndl    VAR    4
  29. taskcount    VAR    2
  30.     ALGN    0,4    ;for '020 efficiency
  31. hdrsize    ENDR
  32.  
  33.     RECORD    0,INCREMENT
  34.     FILL    ioQElSize
  35. vblQEl1    VAR    vblSize
  36. sndPB    VAR    ioQElSize
  37. vblQEl2    VAR    vblSize
  38.     FILL    4    ;for rate -- mode overlaps vblPhase
  39. readbuff    VAR    buffsize
  40. overrun    VAR    368
  41.     ALGN    0,4    ;for '020 efficiency
  42. blksize    ENDR
  43.  
  44. ratevalue    EQU    $00010000
  45.  
  46.     RESOURCE    'sysz' 0
  47.     DC.L    (codeend-codestart)+1024+hdrsize+N*blkSize
  48.  
  49.  
  50.     RESOURCE    'INIT' 128 'AsyncInit' 1<<resSysHeap+1<<resLocked
  51. codestart
  52.     JMP    install
  53.     DC.W    'Copyright © 1990 Harvey Grosser'
  54.  
  55.  
  56. readcomp:
  57.  
  58. countR    EQU    D1
  59. MACRO    extR    =D2|    ;EQU doesn't work properly in MOVEM or index reg.
  60.  
  61.     MOVE.L    A3,-(A7)
  62.     MOVE.L    ioOwnBuf(A0),A3
  63.     MOVEM.L    extlen(A3),extR/A1
  64.     MOVE.L    ioActCount(A0),countR
  65.     CMP.L    extR,countR
  66.     BGT.S    @gtov
  67.  
  68.     SUBQ.W    #1,taskcount(A3)
  69.     BNE.S    @more
  70.     MEA1    closed,ioCompletion(A0)
  71.     _Close    ,ASYNC
  72.     BRA.S    @restore
  73.  
  74. @more
  75.     LEA    readbuff(A0),A0
  76.     MOVE.L    countR,D0
  77.     _BlockMove
  78.     MOVE.L    D0,extlen(A3)  ;better than CLR.L on 68000
  79.     ADDA.L    countR,A1
  80.     SUB.L    countR,extR
  81.  
  82.     MOVE.L    #$80808080,D0
  83.     MOVEQ    #3,countR
  84.     AND.W    extR,countR
  85.     BRA.S    @1
  86. @0    MOVE.B    D0,(A1)+
  87. @1    DBRA    countR,@0
  88.     LSR.W    #3,extR
  89.     BCS.S    @3
  90.     BRA.S    @4
  91. @2    MOVE.L    D0,(A1)+
  92. @3    MOVE.L    D0,(A1)+
  93. @4    DBRA    extR,@2
  94.  
  95.     BRA.S    @restore
  96. @gtov
  97.     ;amount read is greater than previous overrun
  98.     LEA    readbuff(A0),A0
  99.     MOVE.L    extR,D0
  100.     _BlockMove
  101.     LEA    -6(A0,extR),A1
  102.     LEA    sndPB-readbuff(A0),A0
  103.     MOVE.L    A1,ioBuffer(A0)
  104.     MOVE.W    D0,(A1)+    ;D0 = 0 (ffMode) from BlockMove
  105.     MOVE.L    rate(A3),(A1)+
  106.     SUB.L    extR,countR    ;amount left in buffer
  107.     ADDA.L    countR,A1    ;point beyond data just read
  108.     MOVE.L    #370<<16,extR    ;largest possible dividend + 1
  109.     SUB.L    countR,extR
  110.     DIVU    #370,extR
  111.     CLR.W    extR
  112.     SWAP    extR
  113.     ADD.L    extR,countR
  114.  
  115.     MOVE.L    countR,ioReqCount(A0)
  116.     _Write    ,ASYNC
  117.  
  118.     MOVEM.L    extR/A1,extlen(A3)
  119. @restore
  120.     MOVE.L    (A7)+,A3
  121.     RTS
  122.  
  123. closed
  124.     MOVE.L    ioOwnBuf(A0),A1
  125.     MOVE.L    datahndl(A1),A0
  126.     _HUnlock
  127.     _HPurge
  128.     MOVE.L    codehndl(A1),A0
  129.     _HUnlock
  130.     _HPurge
  131.     RTS
  132.  
  133.  
  134. sndcomp:
  135.     BEQ.S    @nokill        ;test for _KillIO
  136.     CLR.L    ioReqCount-sndPB(A0)    ;terminate on _KillIO
  137. @nokill    MOVE.B    #$80,SoundLevel    ;eliminate end click on Mac SE
  138.     TST.B    FSBusy
  139.     BNE.S    @read
  140.     LEA    vblQEl1-sndPB(A0),A0
  141.     ADDQ.W    #1,vblCount(A0)
  142.     _VInstall
  143.     RTS
  144. @read
  145.     LEA    -sndPB(A0),A0
  146.     _Read    ,ASYNC
  147.     RTS
  148.  
  149.  
  150. vbltask1:
  151.     TST.B    FSBusy
  152.     BNE.S    @read
  153.     MOVE.L    A0,A2
  154.     SUBQ    #2,A7
  155.     _SCSIStat
  156.     TST.W    (A7)+
  157.     BEQ.S    @scsifree
  158.     ADDQ.W    #1,vblCount(A2)
  159.     RTS
  160. @scsifree
  161.     LEA    vblQEl2-vblQEl1(A2),A0
  162.     LEA    VBLQueue,A1
  163.     _Enqueue
  164.     RTS
  165. @read
  166.     LEA    -vblQEl1(A0),A0
  167.     _Read    ,ASYNC
  168.     RTS
  169.  
  170.  
  171. vbltask2:
  172.     _VRemove        ;-> D0 = 0
  173.     BCLR    #inVBL,VBLQueue+qFlags
  174.     CLR.L    (A0)    ;qLink
  175.     ADDQ.W    #1,vblCount(A0)
  176.     LEA    -vblQEl2(A0),A0
  177.     _Read    ,ASYNC
  178.     RTS
  179. compend
  180.  
  181.  
  182. openerr:
  183.     MOVE.L    datahndl(A3),A0
  184.     MOVE.L    D0,D1
  185.     _DisposHandle
  186.     MOVE.L    D1,D0
  187. nomem:
  188.     NEG.W    D0
  189.     MOVE.W    D0,-(A7)
  190.     _SysBeep
  191.     RTS
  192.  
  193. install:
  194.     _HLock
  195.     MOVE.L    A0,D6
  196.     MOVE.L    #hdrsize+N*blkSize,D0
  197.     MOVE.L    D0,D1
  198.     _ResrvMem    ,SYS
  199.     MOVE.L    D1,D0
  200.     _NewHandle    ,SYS
  201.     BNE    nomem
  202.     _HLock    ;returns D0.L = 0
  203.     MOVEA.L    (A0),A3
  204.     MOVE.L    A3,A2
  205.     MOVEQ    #(hdrsize+readbuff)/4-1,D1
  206. @clr    MOVE.L    D0,(A2)+    ;faster than CLR.L
  207.     DBRA    D1,@clr    ;A2 points to readbuff
  208.  
  209.     MOVE.W    #N,taskcount(A3)
  210.     MOVE.L    A0,datahndl(A3)
  211.     MOVE.L    D6,codehndl(A3)
  212.     MOVE.L    #ratevalue,rate(A3)
  213.  
  214.     LEA    hdrsize(A3),A0
  215.     MEA1    'StartupSound',ioFileName(A0)
  216.     MOVE.B    #fsRdPerm,ioPermssn(A0)
  217.     _HOpen        ;we'll eventually specify a DirID
  218.     BNE    openerr
  219.     MEA1    readcomp,ioCompletion(A0)
  220.     MOVE.L    A3,ioOwnBuf(A0)
  221.     MOVE.L    A2,ioBuffer(A0)    ;points to readbuff
  222.     MOVE.L    #buffsize,ioReqCount(A0)
  223. ;    ;CLR.W    ioPosMode(A0)    ;= fsAtMark
  224.     MOVE.W    #sndRefNum,sndPB+ioRefNum(A0)
  225.     MEA1    sndcomp,sndPB+ioCompletion(A0)
  226.     ADDQ.W    #vType,vblQEl1+qType(A0)
  227.     ADDQ.W    #vType,vblQEl2+qType(A0)
  228.     MEA1    vbltask1,vblQEl1+vblAddr(A0)
  229.     MEA1    vbltask2,vblQEl2+vblAddr(A0)
  230.     ADDQ.W    #1,vblQEl2+vblCount(A0)
  231.  
  232.     _Read    ,ASYNC
  233.     MOVEQ    #N-2,D1
  234.     MOVE.L    #blksize,D5
  235. @top
  236.     MOVE.L    #readbuff,D0
  237.     LEA    0(A0,D5.L),A1
  238.     _BlockMove
  239.     ADD.L    D5,ioBuffer(A1)
  240.     MOVE.L    A1,A0
  241.     _Read    ,ASYNC
  242.     DBRA    D1,@top
  243.     MOVE.L    D6,-(A7)
  244.     _DetachResource
  245.     MOVE.L    D6,A0
  246.     MOVE.L    #compend-codestart,D0
  247.     _SetHandleSize
  248.     RTS
  249. codeend
  250.     END
  251.  
  252.